package nameless.aistudy.domain.model.subjects.english.reading.article;

import lombok.Data;
import java.time.LocalDateTime;

/**
 * Article 被明确为聚合根（唯一出口）
 * 聚合根负责管理其内部状态和核心业务逻辑。
 */
@Data
public class Article {
    private Integer id;
    private String title;
    private String content;
    private Integer viewCount;
    private String source;
    private Boolean isPublic;
    private Boolean isDeleted;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

    // ========== 构造方法 (用于创建新文章) ==========
    /**
     * 私有构造函数，强制通过工厂方法创建。
     * @param title 文章标题
     * @param content 文章内容 (HTML)
     * @param source 来源 (net/ai/user)
     */
    private Article(String title, String content, String source) {
        this.title = title;
        this.content = content;
        this.source = source;
        this.viewCount = 0; // 新文章浏览量为0
        this.isPublic = true; // 默认公开
        this.isDeleted = false; // 默认未删除
        this.createdAt = LocalDateTime.now();
        this.updatedAt = LocalDateTime.now();
    }

    // ========== 工厂方法 (Factory Method) ==========
    /**
     * 创建新文章的工厂方法
     * @param title 文章标题
     * @param content 文章内容
     * @param source 来源
     * @return 新的 Article 聚合根实例
     */
    public static Article create(String title, String content, String source) {
        // 可以在这里加入创建前的业务规则校验
        if (title == null || title.trim().isEmpty()) {
            throw new IllegalArgumentException("文章标题不能为空");
        }
        if (content == null || content.trim().isEmpty()) {
            throw new IllegalArgumentException("文章内容不能为空");
        }
        if (source == null || (!"net".equals(source) && !"ai".equals(source) && !"user".equals(source))) {
            throw new IllegalArgumentException("文章来源必须是 'net', 'ai' 或 'user'");
        }
        return new Article(title, content, source);
    }

    // ========== 业务行为 (Behaviors) ==========
    /**
     * 更新文章内容和标题
     * @param newTitle 新标题
     * @param newContent 新内容
     */
    public void update(String newTitle, String newContent) {
        if (isDeleted) {
            throw new IllegalStateException("无法更新已删除的文章");
        }
        if (newTitle != null && !newTitle.trim().isEmpty()) {
            this.title = newTitle;
        }
        if (newContent != null && !newContent.trim().isEmpty()) {
            this.content = newContent;
        }
        this.updatedAt = LocalDateTime.now();
    }

    /**
     * 标记文章为公开或私密
     * @param isPublic 是否公开
     */
    public void changePublicStatus(Boolean isPublic) {
        if (isDeleted) {
            throw new IllegalStateException("无法修改已删除文章的公开状态");
        }
        if (isPublic != null) {
            this.isPublic = isPublic;
            this.updatedAt = LocalDateTime.now();
        }
    }

    /**
     * 软删除文章
     */
    public void delete() {
        if (isDeleted) {
            return; // 已经删除，无需重复操作
        }
        this.isDeleted = true;
        this.updatedAt = LocalDateTime.now();
    }

    /**
     * 恢复已删除的文章
     */
    public void restore() {
        if (!isDeleted) {
            return; // 未删除，无需恢复
        }
        this.isDeleted = false;
        this.updatedAt = LocalDateTime.now();
    }

    /**
     * 增加浏览量
     */
    public void incrementViewCount() {
        if (!isDeleted && isPublic) { // 只有未删除且公开的文章才增加浏览量
            this.viewCount = (this.viewCount == null ? 0 : this.viewCount) + 1;
            // 注意：浏览量增加通常不会立即更新 updatedAt 或持久化，可能批量更新
        }
    }

    // ========== 查询方法 (Queries) ==========
    /**
     * 判断文章是否有效（未删除且公开）
     * @return true if valid
     */
    public boolean isValid() {
        return !isDeleted && isPublic;
    }

    /**
     * 获取文章摘要 (例如前200个字符)
     * @return 摘要
     */
    public String getSummary() {
        if (content == null) return "";
        return content.length() > 200 ? content.substring(0, 200) + "..." : content;
    }
}